#include<iostream>
using namespace std;
template <typename T>
class arrList
{
private:
    int position;//当前处理的位置
    T *aList;// 数组构建的顺序表
    int maxSize;//顺序表的最大长度
    int curLen;//顺序表的当前长度
public:
    arrList(const int size)
    {
        maxSize = size;
        aList = new T[maxSize];
        curLen = position = 0;
    }
    ~arrList(){
        delete [] aList;
    }
    void clear(){
        delete [] aList;
        curLen = position = 0;
        aList = new T[maxSize];
    }
    // 返回顺序表的长度
    int length(){return curLen;}
    // 在顺序表后面添加元素
    bool append(const T value){
        if(curLen == maxSize)
        {
            cout<<"顺序表已满无法添加"<<endl;
            return false;
        }
        else
        {
            aList[curLen] = value;
            curLen++;
            return true;
        }

    }
    // 设置顺序表中下标p的值为value
    bool setValue(const int p,const T value)
    {
        if(curLen>maxSize)
        {
            cout<<"顺序表溢出"<<endl;
            return false;
        }
        else if(p<0||p>curLen)
        {
            cout<<"获取位置错误";
            return false;
        }
        else
        {
            aList[p] = value;
            return true;
        }
    }
    // 获取下标为p的元素的值
    bool getValue(const int p,T& value)
    {
        if(p>maxSize)
        {
            cout<<"顺序表溢出"<<endl;
            return false;
        }
        else if(p<0||p>curLen)
        {
            cout<<"获取下标错误"<<endl;
            return false;
        }
        else
        {
            value = aList[p];
            return true;
        }
    }
    // 获取value的下标
    bool getPos(int &p,const T value)
    {
        if(p>maxSize)
        {
            cout<<"顺序表溢出"<<endl;
            return false;
        }
        else if(p<0||p>curLen)
        {
            cout<<"顺序表获取位置错误"<<endl;
            return false;
        }
        else
        {
            for(int i=0;i<curLen;i++)
            {
                if(aList[i] == value)
                {
                    p = i;
                    return true;
                }
            }
            return false;
        }
    }
    // 在位置p插入元素
    bool insert(const int p,const T value)
    {
        int i;
        if(curLen>maxSize)
        {
            cout<<"顺序表溢出"<<endl;
            return false;
        }
        else if(p<0||p>curLen)
        {
            cout<<"插入位置不合法"<<endl;
            return false;
        }
        else
        {
            for(i = curLen;i>p;i--)
            {
                aList[i] = aList[i-1];//将位置curLen空出
            }
            aList[p] = value;//将值插入空位
            curLen++;//插入元素后长度增加1
            return true;
        }
    }
    // 删除顺序表中位置为p的元素
    bool Delete(const int p)
    {
        int i;
        if(curLen <= 0)
        {
            cout<<"这是一个空表\n"<<endl;
            return false;
        }
        else if(p<0||p>curLen-1)
        {
            cout<<"删除位置不合法"<<endl;
            return false;
        }
        else
        {
            for(i = p;i<curLen;i++)
            {
                // 删除元素后从位置p开始每个元素左移
                aList[i] = aList[i+1];
                curLen--;
                return true;
            }
        }
    }

};
